#include <stdio.h>
#define PID_FILE "/tmp/my_daemon.pid"

#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#include <stdarg.h>



//执行逻辑
void action() {

    printf("hello world\n");


    //读取设备数据 （含 主数据， 列车重量， 列车能耗等数据）
    //检查列车数据时间， 始终频率， 是否处于节能开关状态
    //循环列车 （1 - 4 ）
        //检查优先配置项，强制控制的项，如 二氧化碳超高
        //判断工况
        //

    // 简单的进程常驻与 CLI 控制实现
    // 支持: ./main start  启动守护进程
    //      ./main stop   停止守护进程
    //      ./main status 查询状态

    // 进程 PID 文件

}

// 写入日志到 log.log 文件，支持追加模式
// write_log 用于将格式化日志信息写入 log.log 文件（以追加模式）。
// 用法示例：
//     write_log("程序启动，参数: %d, %s", 123, "abc");
//     write_log("错误: %s", strerror(errno));
//
// 该函数支持 printf 风格的格式化参数，自动在每条日志后添加换行。
// 日志文件 log.log 会自动创建（如不存在），并以追加方式写入。

void write_log(const char *fmt, ...) {
    FILE *fp = fopen("/tmp/log.log", "a");
    if (!fp) return;
    va_list args;
    va_start(args, fmt);
    vfprintf(fp, fmt, args);
    va_end(args);
    fprintf(fp, "\n");
    fclose(fp);
}

// 守护进程主循环
void daemon_main_loop() {s
    while (1) {
        // 这里可以放置实际业务逻辑
        action();
        
        
        // 示例：每隔5秒打印一次
        printf("[daemon] running... (pid=%d)", getpid());
        write_log("[daemon] running... (pid=%d)", getpid());
        fflush(stdout);



        //定时 2 秒钟
        sleep(2);
    }
}

// 写入PID文件
int write_pid_file(const char *pidfile) {
    FILE *fp = fopen(pidfile, "w");
    if (!fp) return -1;
    fprintf(fp, "%d\n", getpid());
    fclose(fp);
    return 0;
}

// 读取PID文件
pid_t read_pid_file(const char *pidfile) {
    FILE *fp = fopen(pidfile, "r");
    if (!fp) return -1;
    pid_t pid = -1;
    fscanf(fp, "%d", &pid);
    fclose(fp);
    return pid;
}

// 删除PID文件
void remove_pid_file(const char *pidfile) {
    unlink(pidfile);
}

// 检查进程是否存在
int is_process_running(pid_t pid) {
    if (pid <= 0) return 0;
    return (kill(pid, 0) == 0);
}

// 守护进程化
void daemonize() {
    pid_t pid = fork();
    if (pid < 0) exit(EXIT_FAILURE);
    if (pid > 0) exit(EXIT_SUCCESS); // 父进程退出

    setsid(); // 新会话
    umask(0);
    chdir("/");

    // 关闭标准输入输出
    fclose(stdin);
    fclose(stdout);
    fclose(stderr);
}

int main(int argc, char *argv[]) {
    if (argc < 2) {
        printf("Usage: %s {start|stop|status}\n", argv[0]);
        return 1;
    }

    if (strcmp(argv[1], "start") == 0) {
        pid_t oldpid = read_pid_file(PID_FILE);
        if (is_process_running(oldpid)) {
            printf("Daemon already running (pid=%d)\n", oldpid);
            return 0;
        }
        daemonize();
        if (write_pid_file(PID_FILE) != 0) {
            // 写入失败
            exit(EXIT_FAILURE);
        }
        daemon_main_loop();
        // never return
    } else if (strcmp(argv[1], "stop") == 0) {
        pid_t pid = read_pid_file(PID_FILE);
        if (pid <= 0) {
            printf("No daemon running.\n");
            return 1;
        }
        if (kill(pid, SIGTERM) == 0) {
            printf("Sent SIGTERM to daemon (pid=%d)\n", pid);
            // 等待进程退出
            for (int i = 0; i < 10; ++i) {
                if (!is_process_running(pid)) break;
                usleep(200*1000);
            }
            remove_pid_file(PID_FILE);
        } else {
            printf("Failed to stop daemon (pid=%d): %s\n", pid, strerror(errno));
            remove_pid_file(PID_FILE);
            return 1;
        }
    } else if (strcmp(argv[1], "status") == 0) {
        pid_t pid = read_pid_file(PID_FILE);
        if (is_process_running(pid)) {
            printf("Daemon is running (pid=%d)\n", pid);
            return 0;
        } else {
            printf("Daemon is not running.\n");
            return 1;
        }
    } else {
        printf("Unknown command: %s\n", argv[1]);
        printf("Usage: %s {start|stop|status}\n", argv[0]);
        return 1;
    }
    return 0;
}

